﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class PessoaFormacaoEscolar
    {
        #region Variaveis Membro
        private int _idFormacao;
        private int _idPessoa;
        private TipoFormacao _tipoFormacao;
        private Instituicao _instituicao;
        private string _nomeCurso;
        private TipoDuracaoCurso _duracaoCurso;
        private StatusFormacao _statusFormacao;
        private DateTime? _dataConclusao;
        private ConselhoClasse _conselho;
        private string _numeroRegistro;
        private Pais _pais;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdFormacao
        {
            get { return _idFormacao; }
            set { _idFormacao = value; }
        }
        public int IdPessoa
        {
            get { return _idPessoa; }
            set { _idPessoa = value; }
        }
        public TipoFormacao TipoFormacao
        {
            get { return _tipoFormacao; }
            set { _tipoFormacao = value; }
        }
        public Instituicao Instituicao
        {
            get { return _instituicao; }
            set { _instituicao = value; }
        }
        public string NomeCurso
        {
            get { return _nomeCurso; }
            set { _nomeCurso = value; }
        }
        public TipoDuracaoCurso DuracaoCurso
        {
            get { return _duracaoCurso; }
            set { _duracaoCurso = value; }
        }
        public StatusFormacao StatusFormacao
        {
            get { return _statusFormacao; }
            set { _statusFormacao = value; }
        }
        public DateTime? DataConclusao
        {
            get { return _dataConclusao; }
            set { _dataConclusao = value; }
        }
        public ConselhoClasse Conselho
        {
            get { return _conselho; }
            set { _conselho = value; }
        }
        public string NumeroRegistro
        {
            get { return _numeroRegistro; }
            set { _numeroRegistro = value; }
        }
        public Pais Pais
        {
            get { return _pais; }
            set { _pais = value; }
        }
        #endregion

        #region Construtores
        public PessoaFormacaoEscolar()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public PessoaFormacaoEscolar(int idFormacao)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idFormacao);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        private void Carregar(int idFormacao)
        {
            try
            {
                var consulta = from f in _context.tab_pessoa_formacao_escolar
                               where f.Id_formacao == idFormacao
                               select new
                               {
                                   f.Id_formacao,
                                   f.tab_pessoa.Id_pessoa,
                                   f.tab_tipo_formacao.id_tipo_formacao,
                                   f.tab_instituicao.Id_instituicao,
                                   f.nome_curso,
                                   f.tab_tipo_duracao_curso.id_tipo_duracao_curso,
                                   f.tab_status_formacao.id_status_fomarcao,
                                   f.dt_conclusao,
                                   f.tab_pais.id_pais,
                                   f.tab_conselho_classe.Id_conselho,
                                   f.nr_registro
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdFormacao = list.Id_formacao;
                    this.IdPessoa = list.Id_pessoa;
                    this.TipoFormacao = new TipoFormacao(list.id_tipo_formacao);
                    this.Instituicao = new Instituicao(list.Id_instituicao);
                    this.NomeCurso = list.nome_curso;
                    this.DuracaoCurso = new TipoDuracaoCurso(list.id_tipo_duracao_curso);
                    this.StatusFormacao = new StatusFormacao(list.id_status_fomarcao);
                    this.DataConclusao = list.dt_conclusao;
                    this.Conselho = new ConselhoClasse(list.Id_conselho);
                    this.NumeroRegistro = list.nr_registro;
                    this.Pais = new Pais(list.id_pais);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        protected void RecuperaId()
        {
            try
            {
                var consulta = from f in _context.tab_pessoa_formacao_escolar
                               where f.tab_pessoa.Id_pessoa == this.IdPessoa
                               && f.tab_tipo_formacao.id_tipo_formacao == this.TipoFormacao.IdTipoFormacao
                               && f.tab_instituicao.Id_instituicao == this.Instituicao.IdInstituicao
                               && f.nome_curso == this.NomeCurso
                               && f.tab_status_formacao.id_status_fomarcao == this.StatusFormacao.IdStatusFormacao
                               && f.dt_conclusao == this.DataConclusao
                               && f.tab_pais.id_pais == this.Pais.IdPais
                               orderby f.Id_formacao descending
                               select f;

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdFormacao = list.Id_formacao;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Publicos

        #region Metodos de Selecao
        public List<PessoaFormacaoEscolar> SelectAll()
        {
            try
            {
                List<PessoaFormacaoEscolar> listFormacao = new List<PessoaFormacaoEscolar>();


                var consulta = from f in _context.tab_pessoa_formacao_escolar
                               select new
                               {
                                   f.Id_formacao,
                                   f.tab_pessoa.Id_pessoa,
                                   f.tab_tipo_formacao.id_tipo_formacao,
                                   f.tab_instituicao.Id_instituicao,
                                   f.nome_curso,
                                   f.tab_tipo_duracao_curso.id_tipo_duracao_curso,
                                   f.tab_status_formacao.id_status_fomarcao,
                                   f.dt_conclusao,
                                   f.tab_pais.id_pais,
                                   f.tab_conselho_classe.Id_conselho,
                                   f.nr_registro
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaFormacaoEscolar formacao = new PessoaFormacaoEscolar();
                    this.IdFormacao = list.Id_formacao;
                    this.IdPessoa = list.Id_pessoa;
                    this.TipoFormacao = new TipoFormacao(list.id_tipo_formacao);
                    this.Instituicao = new Instituicao(list.Id_instituicao);
                    this.NomeCurso = list.nome_curso;
                    this.DuracaoCurso = new TipoDuracaoCurso(list.id_tipo_duracao_curso);
                    this.StatusFormacao = new StatusFormacao(list.id_status_fomarcao);
                    this.DataConclusao = list.dt_conclusao;
                    this.Conselho = new ConselhoClasse(list.Id_conselho);
                    this.NumeroRegistro = list.nr_registro;
                    this.Pais = new Pais(list.id_pais);

                    listFormacao.Add(formacao);
                }

                return listFormacao;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<PessoaFormacaoEscolar> SelectPor(int idPessoa)
        {
            try
            {
                List<PessoaFormacaoEscolar> listFormacao = new List<PessoaFormacaoEscolar>();


                var consulta = from f in _context.tab_pessoa_formacao_escolar
                               where f.tab_pessoa.Id_pessoa == idPessoa
                               select new
                               {
                                   f.Id_formacao,
                                   f.tab_pessoa.Id_pessoa,
                                   f.tab_tipo_formacao.id_tipo_formacao,
                                   f.tab_instituicao.Id_instituicao,
                                   f.nome_curso,
                                   f.tab_tipo_duracao_curso.id_tipo_duracao_curso,
                                   f.tab_status_formacao.id_status_fomarcao,
                                   f.dt_conclusao,
                                   f.tab_pais.id_pais,
                                   f.tab_conselho_classe.Id_conselho,
                                   f.nr_registro
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaFormacaoEscolar formacao = new PessoaFormacaoEscolar();
                    this.IdFormacao = list.Id_formacao;
                    this.IdPessoa = list.Id_pessoa;
                    this.TipoFormacao = new TipoFormacao(list.id_tipo_formacao);
                    this.Instituicao = new Instituicao(list.Id_instituicao);
                    this.NomeCurso = list.nome_curso;
                    this.DuracaoCurso = new TipoDuracaoCurso(list.id_tipo_duracao_curso);
                    this.StatusFormacao = new StatusFormacao(list.id_status_fomarcao);
                    this.DataConclusao = list.dt_conclusao;
                    this.Conselho = new ConselhoClasse(list.Id_conselho);
                    this.NumeroRegistro = list.nr_registro;
                    this.Pais = new Pais(list.id_pais);

                    listFormacao.Add(formacao);
                }

                return listFormacao;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persistencia
        public void Salvar()
        {
            try
            {
                if (this.IdFormacao == 0)
                {
                    tab_pessoa_formacao_escolar tabFormacao = new tab_pessoa_formacao_escolar();
                    tabFormacao.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                    tabFormacao.tab_tipo_formacaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_formacao", "id_tipo_formacao", this.TipoFormacao.IdTipoFormacao);
                    tabFormacao.tab_instituicaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_instituicao", "Id_instituicao", this.Instituicao.IdInstituicao);
                    tabFormacao.nome_curso = this.NomeCurso;
                    tabFormacao.tab_tipo_duracao_cursoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_duracao_curso", "id_tipo_duracao_curso", this.DuracaoCurso.IdTipoDucacao);
                    tabFormacao.tab_status_formacaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status_formacao", "id_status_fomarcao", this.StatusFormacao.IdStatusFormacao);
                    tabFormacao.dt_conclusao = this.DataConclusao;
                    tabFormacao.tab_conselho_classeReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_conselho_classe", "Id_conselho", this.Conselho.IdConselho);
                    tabFormacao.nr_registro = this.NumeroRegistro;
                    tabFormacao.tab_paisReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pais", "id_pais", this.Pais.IdPais);

                    _context.AddTotab_pessoa_formacao_escolar(tabFormacao);
                    _context.SaveChanges();

                    RecuperaId();
                }
                else
                {
                    tab_pessoa_formacao_escolar tabFormacao = (from f in _context.tab_pessoa_formacao_escolar
                                                               where f.Id_formacao == this.IdFormacao
                                                               select f).First();

                    tabFormacao.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                    tabFormacao.tab_tipo_formacaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_formacao", "id_tipo_formacao", this.TipoFormacao.IdTipoFormacao);
                    tabFormacao.tab_instituicaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_instituicao", "Id_instituicao", this.Instituicao.IdInstituicao);
                    tabFormacao.nome_curso = this.NomeCurso;
                    tabFormacao.tab_tipo_duracao_cursoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_duracao_curso", "id_tipo_duracao_curso", this.DuracaoCurso.IdTipoDucacao);
                    tabFormacao.tab_status_formacaoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status_formacao", "id_status_fomarcao", this.StatusFormacao.IdStatusFormacao);
                    tabFormacao.dt_conclusao = this.DataConclusao;
                    tabFormacao.tab_conselho_classeReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_conselho_classe", "Id_conselho", this.Conselho.IdConselho);
                    tabFormacao.nr_registro = this.NumeroRegistro;
                    tabFormacao.tab_paisReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pais", "id_pais", this.Pais.IdPais);

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void Excluir()
        {
            try
            {
                if (this.IdFormacao != 0)
                {
                    tab_pessoa_formacao_escolar tabFormacao = (from f in _context.tab_pessoa_formacao_escolar
                                                               where f.Id_formacao == this.IdFormacao
                                                               select f).First();

                    _context.DeleteObject(tabFormacao);
                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
